package demo1;

/**
 * Created with IntelliJ IDEA.
 * Description:泛型
 * User: LianBao
 * Date: 2024-03-21
 * Time: 15:42
 */

class MyOldArray {
    public Object[] array = new Object[10];

    public void setValue(int pos, Object val) {
        array[pos] = val;
    }

    public Object getValue(int pos) {
        return array[pos];
    }
}


/**
 * @param <T> 代表当前类是一个泛型类
 */
class MyArray<T> {
    //把数据类型传给这个类,  <T>接收

    public Object[] arr = new Object[10];//最好的写法✔


//    public T[] arr1 = new T[10];//报错,数组是一种类型,new的时候必须知道是什么类型
//    public T[] arr = (T[]) new Object[10];//这个方式不好,是警告

    /*
    1.(编译的时候)每次存储数据时都会检查存入的数据是不是指定的类型
    2.运行时没有泛型这个概念
     */
    public T getValue(int pos) {
        return (T) arr[pos];
    }

    public void setValue(int pos, T val) {
        arr[pos] = val;
    }
}


/**
 * 泛型的上界:可以限定传入的类型,
 */
class Person<T extends Number> {
    //传入的类型一定是Number,不能是String
}

class Person2<T extends Comparable<T>> {
    //传入的类型必须实现了Comparable
}

//泛型方法

class Test {
    //    public static void func();相当于多了一个<阿巴阿巴>
    public static <T extends Comparable<T>> void func() {

    }
}

class FindMax<T extends Comparable<T>> {

    public T findMax(T[] array) {
        T max = array[0];
        for (int i = 0; i < array.length; i++) {
            if (max.compareTo(array[i]) > 0) {
                max = array[i];
            }
        }
        return max;
    }

}

public class Test1 {

    public static void main1(String[] args) {

        MyArray<Integer> myArray = new MyArray<>();//new MyArray<Integer>();也可以写成这样,后面的Integer可以省略
        //<>里面只能写引用类型(包括自定义的类型),不能写基本数据类型
        myArray.setValue(0, 1999);
//        myArray.setValue(0, "hello");报错,检查出类型不匹配
        System.out.println(myArray.getValue(0));

        MyArray<String> myArray2 = new MyArray<>();

        MyArray myArray3 = new MyArray<>();//没写<>,是裸类型,是为了兼容以前的版本,会有警告!

    }

    /**
     * 重点:泛型是怎么编译的?->
     * 编译好之后,已经把T替换成Object
     * 这就是泛型擦除机制
     */


    public static void main0(String[] args) {
        MyOldArray myOldArray = new MyOldArray();
        myOldArray.setValue(0, 1);
        myOldArray.setValue(1, true);
        myOldArray.setValue(2, "hello");
        int ret1 = (int) myOldArray.getValue(0);//此时需要强制转换,否则报错
    }

}
